package br.com.jw.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import br.com.jw.jdbc.Pool;
import br.com.jw.modelo.Venda;

public class VendaDao {
	Connection conn;
	private Pool pool;
	PreparedStatement stmt;
	int resultado = 0;
	Venda venda;

	public VendaDao(Pool pool) {
		this.pool = pool;
	}

	public ArrayList<Venda> listaVendaCliente(int cli_id)
			throws ClassNotFoundException, SQLException {

		String sql = "select ven_pro_id,cli_nome,usu_login,ven_pro_qtde,pro_nome from venda v "
				+ "inner join cliente c on v.ven_cli_id = c.cli_id "
				+ "inner join produto p on p.pro_id = v.ven_pro_id "
				+ "inner join usuario u  on v.ven_usu_id = u.usu_id where cli_id=?";
		conn = pool.getConnection();
		try {
			ArrayList<Venda> listaVendaCliente = new ArrayList<Venda>();
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, cli_id);
			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				listaVendaCliente.add(new Venda(rs.getInt("ven_pro_id"), rs
						.getString("cli_nome"), rs.getString("pro_nome"), rs
						.getInt("ven_pro_qtde"), rs.getString("usu_login")));
			}
			stmt.close();
			return listaVendaCliente;

		} finally {
			pool.liberarConexao(conn);
		}

	}

	public List<Venda> getVendas() throws ClassNotFoundException, SQLException {

		List<Venda> listaVendas = new ArrayList<Venda>();
		String sql = "select ven_pro_id,cli_nome, pro_nome, ven_pro_qtde, usu_login "
				+ "from venda "
				+ "join usuario usuario on (venda.ven_usu_id = usuario.usu_id) "
				+ "join produto produto on (venda.ven_pro_id = produto.pro_id) "
				+ "join cliente cliente on (venda.ven_cli_id = cliente.cli_id) ";

		conn = pool.getConnection();

		try {
			stmt = conn.prepareStatement(sql);
			ResultSet rs = stmt.executeQuery();
			while (rs.next()) {
				listaVendas.add(new Venda(rs.getInt("ven_pro_id"), rs
						.getString("cli_nome"), rs.getString("pro_nome"), rs
						.getInt("ven_pro_qtde"), rs.getString("usu_login")));
			}

			stmt.close();
			rs.close();

			return listaVendas;

		} finally {
			pool.liberarConexao(conn);
		}
	}

	public boolean somarQuantidade(int pro_id, int pro_qtde)
			throws ClassNotFoundException, SQLException {
		String sql = "update produto set pro_qtde = pro_qtde + ? where pro_id=?";
		conn = pool.getConnection();
		try {

			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, pro_qtde);
			stmt.setInt(2, pro_id);
			stmt.execute();

			stmt.close();
			return true;

		} finally {
			pool.liberarConexao(conn);
		}
	}

	public boolean excluirVenda(Venda venda) throws ClassNotFoundException,
			SQLException {

		String sql = "delete from venda "
				+ "where ven_cli_id = (select cli_id from cliente where cli_nome = ? ) "
				+ "and ven_usu_id = (select usu_id from usuario where usu_login = ? ) "
				+ "and ven_pro_id = (select pro_id from produto where pro_nome = ? ) ";

		conn = pool.getConnection();
		try {
			stmt = conn.prepareStatement(sql);

			stmt.setString(1, venda.getVen_nomeCliente());
			stmt.setString(2, venda.getVen_nomeUsuario());
			stmt.setString(3, venda.getVen_nomeProduto());

			resultado = stmt.executeUpdate();
			if (resultado > 0) {
				somarQuantidade(venda.getVen_pro_id(), venda.getVen_pro_qtde());
			} else {

			}
			stmt.close();
			return true;

		} finally {
			pool.liberarConexao(conn);
		}
	}

	public boolean subtrairQuantidade(int pro_id, int pro_qtde)
			throws ClassNotFoundException, SQLException {
		String sql = "update produto set pro_qtde = pro_qtde - ? where pro_id=?";
		conn = pool.getConnection();
		try {

			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, pro_qtde);
			stmt.setInt(2, pro_id);
			stmt.execute();

			stmt.close();
			return true;

		} finally {
			pool.liberarConexao(conn);
		}
	}

	public int inserirVenda(Venda venda) throws ClassNotFoundException,
			SQLException {

		String sql = "insert into venda (ven_cli_id, ven_usu_id, ven_pro_id, ven_pro_qtde) values (?,?,?,?)";
		conn = pool.getConnection();
		try {
			stmt = conn.prepareStatement(sql);

			stmt.setInt(1, venda.getVen_cli_id());
			stmt.setInt(2, venda.getVen_usu_id());
			stmt.setInt(3, venda.getVen_pro_id());
			stmt.setInt(4, venda.getVen_pro_qtde());

			resultado = stmt.executeUpdate();
			if (resultado > 0) {
				subtrairQuantidade(venda.getVen_pro_id(),
						venda.getVen_pro_qtde());
			} else {

			}
			stmt.close();

			return resultado;

		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			pool.liberarConexao(conn);
		}
		return resultado;
	}

}